package com.mybatis.lo.sqlnode;

import com.mybatis.lo.config.DynamicContext;
import com.mybatis.lo.handler.TokenHandler;
import com.mybatis.lo.parser.GenericTokenParser;
import com.mybatis.lo.registry.SimpleTypeRegistry;
import com.mybatis.lo.utils.OgnlUtils;
import lombok.AllArgsConstructor;

/**
 * 带有`${}`的sql文本信息 节点
 * @author zhangbh
 * 2023-06-09 20:05
 **/
@AllArgsConstructor
public class TextSqlNode implements SqlNode {

    /**
     * 带有`${}`的sql文本信息
     */
    private String sqlText;

    @Override
    public void apply(DynamicContext context) {
        // 用特定的处理器处理
        BoundingParamerterTokenHandler handler = new BoundingParamerterTokenHandler(context);
        GenericTokenParser parser = new GenericTokenParser("${", "}", handler);
        context.append(parser.parse(sqlText));
    }

    /**
     * 处理器
     */
    @AllArgsConstructor
    static class BoundingParamerterTokenHandler implements TokenHandler {

        private DynamicContext dynamicContext;

        @Override
        public String handleToken(String ognl) {
            Object param = dynamicContext.getParam();
            if (param == null) {
                System.out.println("参数为空");
                return "";
            }
            // 如果是简单类型，直接替换了
            if (SimpleTypeRegistry.isSimpleType(param.getClass())) {
                return param.toString();
            }
            Object value = OgnlUtils.getValue(ognl, dynamicContext.getParam());
            if (value == null) {
                System.out.println("ognl没有获取到值信息");
                return "";
            }
            return value.toString();
        }
    }
}
